from flask import g
from flask import request
from flask import session, render_template, current_app, jsonify
# 导入蓝图对象
from info import db
from info.models import User, News, Category, Comment
from info.utils.commons import login_required
from info.utils.response_code import RET
from . import news_blue


@news_blue.route('/')
@login_required
def index():
    '''
    展示用户信息
    1.尝试从redis中获取用户的信息
    2.如果有user_id,则查询用户信息
    3.调用模型类中的to_dict方法
    4.返回数据给模板
    :return:
    '''
    user =g.user

    # 新闻今日排行
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(6)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='数据库异常')
    if not news_list:
        return jsonify(errno=RET.NODATA,errmsg='获取新闻数据失败')
    news_dict_list=[]
    for news in news_list:
        news_dict_list.append(news.to_dict())

    # 分类显示
    try:
        categories = Category.query.all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='数据查询错误')
    if not categories:
        return jsonify(errno=RET.NODATA,errmsg='分类数据查询异常')
    category_list = []
    for category in categories:
        category_list.append(category)

    data={
        'news_dict_list':news_dict_list,
        'user_info':user.to_dict() if user else None,
        'category_list':category_list
    }
    return render_template('news/index.html',data=data)


@news_blue.route('/news_list')
def get_news_list():
    '''
    新闻页面展示
    1.获取参数，cid/page/per_page（后面两个可传可不传）
    2.检查数据格式，把数据格式强转为int
    3.如果cid大于1，则查询cid分类对应的news，并分页显示,按时间降序排列
    4.查询出来的分页对象进行遍历处理，存储到列表中
    5.返回数据，total_page(总页数)，current_page(当前页数)
    :return:
    '''
    cid = request.args.get('cid','1')
    page = request.args.get('page','1')
    per_page = request.args.get('per_page','10')
    # if not cid:
    #     return jsonify(errno=RET.PARAMERR,errmsg='参数错误')
    try:
        cid,page,per_page = int(cid),int(page),int(per_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR,errmsg='参数格式异常')
    filters = [News.status == 0]
    if cid > 1:
        filters.append(News.category_id == cid)
        # print(filters)
        # print(*filters)
    try:
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page,per_page,False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='查询分类数据异常')
    news_list = paginate.items
    total_page = paginate.pages
    current_page = paginate.pages
    news_dict_list = []
    for news in news_list:
        news_dict_list.append(news.to_dict())
    data = {
        'news_dict_list':news_dict_list,
        'total_page':total_page,
        'current_page':current_page
    }
    return jsonify(errno=RET.OK,errmsg='OK',data=data)


@news_blue.route('/<int:news_id>')
@login_required
def get_news_detail(news_id):
    '''
    新闻详情页展示
    1.判断用户是否登陆
    2.根据news_id查询数据
    3.判断查询结果是否存在
    4.让新闻的点击次数加1
    5.提交数据
    6.返回结果

    '''
    user = g.user
    try:
        news = News.query.get(news_id)
        # news_detail = news.to_dict()
        # print(news_detail)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='查询数据异常')
    if not news:
        return jsonify(errno=RET.NODATA,errmsg='无新闻详情数据')
#     让新闻点击次数加1
    news.clicks+=1
    try:
        db.session.add(news)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg='保存数据失败')
        # 新闻今日排行
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(6)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='数据库异常')
    if not news_list:
        return jsonify(errno=RET.NODATA, errmsg='获取新闻数据失败')
    news_dict_list = []
    for new in news_list:
        news_dict_list.append(new.to_dict())

    data = {
        'news_dict_list':news_dict_list,
        'user_info': user.to_dict() if user else None,
        'news_detail':news.to_dict()
    }

    return render_template('news/detail.html', data=data)


@news_blue.route('/news_collect',methods=['POST'])
@login_required
def news_collect():
    '''
    收藏和取消收藏功能
    1.尝试获取用户信息
    2.判断用户是否 已登陆，未登录提示登陆
    3.接收前端传过来的参数
    4.检查参数的完整性，
    5.检查参数的格式
    6.从数据库中查询新闻信息，看是否存在
    7.判断用户的新闻收藏列表里是否已经收藏
    8.收藏append，取消收藏remove
    9.返回结果
    :return:
    '''
    user=g.user
    if user is None:
        return jsonify(errno=RET.LOGINERR,errmsg='用户未登录')
    news_id = request.json.get('news_id')
    action = request.json.get('action')
    if not all([news_id,action]):
        return jsonify(errno=RET.PARAMERR,errmsg='参数缺失')
    try:
        news_id = int(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR,errmsg='新闻参数格式错误')
    if action not in ('collect','cancel_collect'):
        return jsonify(errno=RET.PARAMERR,errmsg='参数错误')
    try:
        news = News.query.get(news_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg='查询数据库异常')
    if not news:
        return jsonify(errno=RET.NODATA,errmsg='新闻数据不存在')
    if action == 'collect':
        if news not in user.collection_news:
            user.collection_news.append(news)
    else:
        user.collection_news.remove(news)
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
    return jsonify(errno=RET.OK,errmsg='操作成功')


@news_blue.route('/favicon.ico')
def favicon():
    # 使用应用上下文对象，调用flask源码中的发送静态文件到浏览器
    return current_app.send_static_file('news/favicon.ico')


